﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Presentation.Permisos.WinForms.Client.ViewModelBase;
using Cesave.Presentation.Permisos.WinForms.Client.Views.Catalogs.Areas;
using Cesave.Application.Permisos.Settings;
using Cesave.Infrastructure.CrossCutting.IoC;
using System.Globalization;
using Cesave.Presentation.Permisos.WinForms.Client.Resources;
using System.Windows.Forms;

namespace Cesave.Presentation.Permisos.WinForms.Client.ViewModels.Catalogs.Areas
{
    /// <summary>
    /// Modelo del catálogo de áreas de influencia.
    /// </summary>
    public partial class AreasViewModel
        : ObservableObject
    {
        #region Private properties

        /// <summary>
        /// Vista del catálogo de áreas de influencia.
        /// </summary>
        private AreasView _view;

        /// <summary>
        /// Opciones de configuración.
        /// </summary>
        private IPUSSettings _pusSettings;

        #endregion

        #region Constructor

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="view">
        /// Vista del catálogo de áreas de influencia.
        /// </param>
        public AreasViewModel(AreasView view)
        {
            if (view == null)
                throw new ArgumentNullException("view");
            _view = view;
            _pusSettings = IoCFactory.Resolve<IPUSSettings>();
            WireUpEvents();
            InitModels();
        }

        #endregion

        #region Event methods

        /// <summary>
        /// Suscribe a la vista a varios eventos.
        /// </summary>
        private void WireUpEvents()
        {
            PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(AreasViewModel_PropertyChanged);
            _view.Load += LoadView;
            _view.saveButton.Click += SaveAreas;
            _view.areaBindingNavigatorSaveItem.Click += SaveAreas;
            _view.closeButton.Click += (sender, e) =>
            {
                _view.Close();
            };
            _view.newButton.Click += AddNewArea;
            _view.bindingNavigatorAddNewItem.Click += AddNewArea;
            _view.areaSeccionesBindingSource.AddingNew += AddingNewAreaSeccion;
        }

        /// <summary>
        /// Se ejecuta al cargar la vista.
        /// </summary>
        private void LoadView(object sender, EventArgs e)
        {
            _view.Text = string.Format(
                CultureInfo.InvariantCulture,
                WindowTitles.AreasWindowTitle
            );
        }

        #endregion

        #region Private methods

        /// <summary>
        /// Carga los modelos principales.
        /// </summary>
        private void InitModels()
        {
            LoadSecciones();
            LoadAreas();
        }

        /// <summary>
        /// Muestra un mensaje al usuario.
        /// </summary>
        /// <param name="message">
        /// Mensaje a mostrar.
        /// </param>
        private void ShowMessage(string message)
        {
            MessageBox.Show(
                _view,
                message,
                WindowTitles.AreasWindowTitle,
                MessageBoxButtons.OK,
                MessageBoxIcon.Error
            );
        }

        /// <summary>
        /// Inicializa la barra de espera.
        /// </summary>
        private void StartWaiting()
        {
            _view.WaitingBar.StartWaiting();
        }

        /// <summary>
        /// Detiene la barra de espera.
        /// </summary>
        private void EndWaiting()
        {
            _view.WaitingBar.EndWaiting();
        }

        /// <summary>
        /// Sitúa el cursor en el control indicado.
        /// </summary>
        /// <param name="control">
        /// Control por default.
        /// </param>
        private void FocusDefaultControl(Control control = null)
        {
            if (control == null)
                _view.ActiveControl = _view.nombreUltraTextEditor;
            else
                _view.ActiveControl = control;
        }

        #endregion

    }
}
